package com.powernode.common.config.redisson;

import lombok.Data;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.redisson.config.SingleServerConfig;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * redisson配置类
 * 用于初始化Redisson客户端，实现与Redis的分布式锁等高级功能集成
 */
@Data
@Configuration
@ConfigurationProperties(prefix = "spring.data.redis")  // 绑定配置文件中前缀为"spring.data.redis"的属性
public class RedissonConfig {
    // Redis服务器主机地址（从配置文件spring.data.redis.host读取）
    private String host;
    // Redis服务器端口号（从配置文件spring.data.redis.port读取）
    private String port;
    // Redis访问密码（从配置文件spring.data.redis.password读取，可为空）
    private String password;
    // 连接超时时间（默认3000毫秒，从配置文件spring.data.redis.timeout读取，无配置时使用默认值）
    private int timeout = 3000;

    // Redis地址前缀常量（Redis协议格式，固定为"redis://"）
    private static String ADDRESS_PREFIX = "redis://";

    /**
     * 创建Redisson客户端实例的Bean
     * RedissonClient提供分布式锁、分布式集合等Redis高级功能操作接口
     *
     * @return 配置好的RedissonClient实例，交由Spring容器管理
     */
    @Bean
    public RedissonClient redissonClient() {
        // 创建Redisson配置对象，用于设置Redis连接参数
        Config config = new Config();
        // 配置单节点Redis模式（适用于非集群环境）
        SingleServerConfig singleServerConfig = config.useSingleServer()
                // 设置Redis服务地址：前缀+主机+端口（如"redis://127.0.0.1:6379"）
                .setAddress(ADDRESS_PREFIX + host + ":" + port)
                // 设置连接超时时间（毫秒），与类中timeout属性绑定
                .setTimeout(timeout)
                // 设置Redis访问密码（若Redis未设置密码，可省略此配置）
                .setPassword(password);//若redis没有设置密码，则无需设置

        // 根据配置创建并返回Redisson客户端实例
        return Redisson.create(config);
    }
}
